import {isDef} from "../../shared/util";
import {Watcher} from "../../core/observer/watcher";
import {invokeLifeCycleHook} from "../../core/instance/lifecycle";

/**
 * 挂载 找到 vm 的挂载节点，并将内容渲染上去
 * 如果传入了挂载节点，则使用传入的挂载节点
 * 如果没有传入挂载节点，则使用配置中的 el 指向的节点
 * 如果 el 指向的内容不存在则报错
 * @param {Reactive} vm Reactive实例
 */
export function mount (vm) {
    // 如果 elem 属性为 null, 则说明 vm 是组件实例
    // 组件实例使用 placeholder 作为 preVNode
    if (!isDef(vm.elem)) {
        vm.preVNode = vm.placeholder;
    }

    // tag
    const tag = isDef(vm.placeholder) ? vm.placeholder.tag : 'app';

    // 创建 render watcher
    vm.renderWatcher = new Watcher(
        vm,
        () => {
            if (!vm._isMounted) {
                invokeLifeCycleHook(vm, 'beforeMount');
            }
            else {
                invokeLifeCycleHook(vm, 'beforeUpdate');
            }
            // console.log(`我是组件${tag}, 我跑了一下`);
        },
        () => {
            vm.vnode = vm.render();
            if (isDef(vm.preVNode)) {
                vm.preVNode = vm.__patch__(vm.preVNode, vm.vnode);
            }
            else {
                vm.preVNode = vm.__patch__(vm.elem, vm.vnode);
            }
            // console.log(vm.vnode);
        },
        () => {
            if (!vm._isMounted) {
                invokeLifeCycleHook(vm, 'mounted');
                vm._isMounted = true;
            }
            else {
                invokeLifeCycleHook(vm, 'updated');
            }
            // console.log(`我是组件${tag}，我跑完了`);
        }
    );
}

